import { ExtractPropTypes, PropType } from 'vue';

export interface ObjectEditProps {
  /**空间信息，geomerty活geojson */
  modelValue: Record<string, any>;
  /**图形类型 */
  type: PlotType;
}

export type OtherType = CreateGraphicMetas[] | (() => Promise<CreateGraphicMetas[]>);

export type IObjectEditProps = Readonly<
  ExtractPropTypes<{
    type: {
      type: PropType<PlotType>;
      default: PlotTypeEnum;
    };
    modelValue: {
      type: ObjectConstructor;
      default: () => {};
    };
    properties: {
      type: ObjectConstructor;
      default: () => {};
    };
    fullScreen: {
      type: BooleanConstructor;
      default: boolean;
    };
    saveData: {
      type: FunctionConstructor;
    };
    flyToObject: {
      type: OtherType;
    };
    otherObject: {
      type: OtherType;
    };
    id: {
      type: StringConstructor;
      default: string;
    };
    areaCode: {
      type: StringConstructor;
    };
    polyonArea: {
      type: (StringConstructor | NumberConstructor)[];
    };
    needAreaCode: {
      type: BooleanConstructor;
      default: boolean;
    };
    needPolyonArea: {
      type: BooleanConstructor;
      default: boolean;
    };
    pluginClass: {
      type: StringConstructor;
      require: boolean;
    };
    topAreaCode: {
      type: StringConstructor;
    };
  }>
>;

export type IObjectEditEmits = (
  event:
    | 'update:modelValue'
    | 'cancel'
    | 'getAllData'
    | 'update:properties'
    | 'update:polyonArea'
    | 'update:areaCode',
  ...args: any[]
) => void;

export enum PlotTypeEnum {
  /**
   * 点
   */
  POINT = 0,
  /**
   * 线
   */
  LINE = 1,
  /**
   * 面
   */
  POLYGON = 2,
  /**
   * 体
   */
  SOILD = 3,
  /**
   * 曲线
   */
  NURBSLINE = 4,
  /**
   * 圆面
   */
  CIRCLESURFACE = 5,
  /**
   * 矩形面
   */
  RECTANGLESURFACE = 6,
  /**
   * 椭圆面
   */
  ELLIPSESURFACE = 7,
  /**
   * 最短路径线曲线
   */
  SHORTESTPATHLINE = 8,
  /**
   * 其他图元
   */
  OTHER = 9,
  /**
   * gltf/glb模型
   */
  GLTF = 10,
  /**
   * 压平面
   */
  FLATTENPOLYGON = 12,
  /**
   * geoemtry collection
   */
  GEOMETRYCOLLECTION = 13,
  /**
   * 距离测量
   */
  LENGTHMEASURE = 100,
  /**
   * 面积测量
   */
  AREAMEASURE = 101,
  /**
   * 角度测量
   */
  ANGLEMEASURE = 102,
  /**
   * 坐标测量
   */
  COORDMEASURE = 103,
  /**
   * 可视域分析
   */
  VIEWSHEDANALYSIS = 104,
  /**
   * 淹没分析
   */
  FLOODANALYSIS = 105,
  /**
   * 等高线分析
   */
  CONTOURLINEANALYSIS = 106,
  /**
   * 坡度分析
   */
  SLOPEANALYSIS = 107,
  /**
   * 坡向分析
   */
  SLOPEASPECTANALYSIS = 108,
  /**
   * 土石方分析
   */
  EARTHWORKANALYSIS = 109,
  /**
   * 高度测量
   */
  HEIGHTMEASURE = 110,
  /**
   * 望山
   */
  LOOKMOUNTAIN = 111,
  /**
   * 瞰海
   */
  LOOKSEA = 112,
  /**
   * 观城
   */
  VIEWCITY = 113,
}
/**关联于PlotTypeEnum */
export type PlotType =
  | 0
  | 1
  | 2
  | 3
  | 4
  | 5
  | 6
  | 7
  | 8
  | 9
  | 10
  | 11
  | 12
  | 13
  | 100
  | 101
  | 102
  | 103
  | 104
  | 105
  | 106
  | 107
  | 108
  | 109
  | 110
  | 111
  | 112
  | 113;

/**
 * 高德地图位置关键字
 */
export interface IAMapPlaceKeyWorldOptions {
  /**
   * 地点关键字 需要被检索的地点文本信息。多个关键字用“|”分割，文本总长度不可超过80字符
   * 必填（keyword或者types二选一必填）
   */
  keywords: string;
  /**
   * 指定地点类型,地点文本搜索接口支持按照设定的POI类型限定地点搜索结果；地点类型与poi typecode是同类内容，可以传入多个poi typecode，相互之间用“|”分隔，内容可以参考POI分类码表；地点（POI）列表的排序会按照高德搜索能力进行综合权重排序；
   * 可选（keyword或者types二选一必填）
   * 120000（商务住宅）150000（交通设施服务）
   */
  types?: string;
  /**
   * 查询城市
   * 可选值：城市中文、中文全拼、citycode、adcode
   * 如：北京/beijing/010/110000 填入此参数后，会尽量优先返回此城市数据，但是不一定仅局限此城市结果，若仅需要某个城市数据请调用citylimit参数。
   * 如：在深圳市搜天安门，返回北京天安门结果。
   * 可选 无（全国范围内搜索）
   */
  city?: string;
  /**
   * 指定城市数据召回限制
   * 可选值：true/false 为true时，仅召回region对应区域内数据
   * 可选
   * false
   */
  citylimit?: boolean;
  /**
   * 当前分页展示的数据条数
   * page_size的取值1-25
   * 可选
   * page_size默认为10
   */
  offset?: number;
  /**
   * 请求第几分页,
   * page_num的取值1-100,
   * 可选
   * page_num默认为1
   */
  page?: number;
  /**
   * 返回结果控制 此项默认返回基本地址信息；取值为all返回地址信息、附近POI、道路以及道路交叉口信息。
   * 可选 base
   */
  extensions?: 'all' | 'base';
  /**
   * 数字签名
   * 请参考数字签名获取和使用方法
   * 可选
   * 无
   */
  sig?: number;
  /**
   * 返回结果格式类型
   * 默认格式为json，目前只支持json格式；
   * 可选
   * json
   */
  output?: string;
  /**
   * 回调函数
   * callback值是用户定义的函数名称，此参数只在output=JSON时有效
   * 可选 无
   */
  callback?: (data: any) => void;
}
export interface IAMapPio {
  parent: string[];
  address: string;
  distance: number;
  pname: string;
  cityname: string;
  type: string;
  location: string;
  name: string;
  id: string;
  photos: {
    url: string;
  };
}
export interface IFeature {
  /**
   * 要素id
   */
  id?: number | string;
  /**
   * 包围盒，可能会有，长度只能有4或者6
   */
  bbox?: Array<number>;
  /**
   * 坐标系
   */
  crs?: any;
  /**
   * 属性
   */
  properties?: any;
  /**
   * 要素集合类型
   */
  type: any;
  /**
   * 图形数据
   */
  geometry: any;
}

export interface PluginObject {
  editGraphicMeta(params: {
    /**
     * 图元类型，点、线、面
     */
    type: PlotType;
    /**
     * 图元名称
     */
    name?: string;
    /**
     * 图元图标，后续再确定
     */
    billboard?: any;
    /**
     * 图元图形数据，如果有则会渲染加飞跃，如果没有，则默认为空并飞跃到重庆
     */
    geometry?: IFeature;
  }): Promise<GraphicMeta>;
  searchPlaces(
    params: IAMapPlaceKeyWorldOptions,
    div?: HTMLDivElement
  ): {
    pois: Array<IAMapPio>;
    flyToPoi: (
      poi: IAMapPio,
      options?: {
        /**
         * 飞跃总时长
         */
        duration?: number;
        /**
         * 最大高度
         */
        maximumHeight?: number;
        /**
         * 偏移信息
         */
        offset?: any;
      }
    ) => Promise<boolean>;
  };
  /**
   * 添加折线
   * @param params
   */
  addPolylineFromPoints(params: {
    /**
     * 点坐标数组，
     */
    points: number[];
    /**
     * 是否包含高度值，默认为false不包含，如果为true则points的length需被3整除，如果false则points需被2整除
     */
    withHeight?: boolean;
    /**
     * 坐标系，默认为wgs84
     * "wsg84" 和 "cscs2000" 都差不多，一般是指从cesium.js和其他的一些gis软件来的坐标点
     * "bd09" 百度地图（不是影像、点子地图）的经纬度坐标点
     * "gcj02" 高德、腾讯地图（不是影像、点子地图）的经纬度坐标点
     */
    crs?: 'wgs84' | 'cscs2000' | 'bd09' | 'gcj02';
    /**
     * 线宽，像素值，默认为1.5
     */
    width?: number;
    /**
     * css表示方式，默认为#ffff0080
     */
    color?: string;
    /**
     * 是否贴地，默认true贴地
     */
    clampGround?: boolean;
  }): {
    /**
     * 销毁
     */
    destroy: () => void;
    /**
     * 显隐
     * @param show
     */
    display: () => void;

    /**
     * 飞跃
     * @param duration
     */
    flyTo: (duration?: number, range?: number) => Promise<void>;
  };
  /**
   * 批量添加图元对象
   * @param geos
   */
  createGraphicMetas(geos: CreateGraphicMetas[]): void;
  /**
   * 飞向一个图元
   * @param id
   * @param duration
   * @returns 飞跃完成返回
   */
  flyToGraphicMeta(id: string | number, duration: number): Promise<boolean>;
}
export interface CreateGraphicMetas {
  billboard?: any;
  geometry: IFeature;
}

export interface GraphicMeta {
  /**
   * 新建图元，如果传入的geometry为空，则调用该接口，可以新建图元
   * @returns 新建完成之后返回，返回新建图元
   */
  create: () => {
    cancle: () => void;
    complete: Promise<IFeature>;
  };
  /**
   * 编辑图元，如果传入的geometry不为空，则调用该接口，可以编辑图元
   * @returns 编辑完成之后返回，返回编辑图元
   */
  edit: () => {
    cancle: () => void;
    complete: Promise<IFeature>;
  };
  /**
   * 清除已有的图元
   */
  clear: () => void;
  /**
   * 销毁，将释放editGraphicMeta方法创建的所有对象
   * @returns
   */
  destroy: () => Promise<void>;
}
